对于函数模板和类模板,模板参数不一定必须是类型,也可是是常规的数值。当以类型(type)作为模板参数的时候,代码中未决定的是类型;当以一般的数字(non-type)作为模板参数的时候,代码中待定的内容便是某些数值。使用者这种模板必须要显示指定数值,模板才能实例化。
1、非类型类模板参数(Nontype Class Template Parameters)
之前章节中的列子中Stack类中使用vector或deque来存储元素。我们也可以使用一个固定大小的数值来存储元素。这么做的好处是在定义一个Stack对象的时候就分配了固定大小的内存空间,之后的元素操作就不再需要内存分配管理了。坏处是这个数值固定大小的设置比较困难,如果设置太小很数组容易满;如果设置太大又浪费内存空间。 一个可行方法是让使用者自己定义数组的最大空间。 如下:
// basics/stack4.hpp
#include
template
class Stack {
private:
T elems[MAXSIZE]; // elements
int numElems; // current number of elements
public:
Stack(); // constructor
void push(T const&); // push element
void pop(); // pop element
T top() const; // return top element
bool empty() const { // return whether the stack is empty
return numElems == 0;
}
bool full() const { // return whether the stack is full
return numElems == MAXSIZE;
}
};
// constructor
template
Stack::Stack ()
: numElems(0) // start with no elements
{
// nothing else to do
}
template
void Stack::push (T const& elem)
{
if (numElems == MAXSIZE) {
throw std::out_of_range("Stack::push(): stack is full");
}
elems[numElems] = elem; // append element
++numElems; // increment number of elements
}
template
void Stack::pop ()
{
if (numElems |